//   ts 可以给函数添加类型  函数的参数和返回值

// 函数声明的两种方式，
// function (){}  function关键字声明 无法标识类型
// 变量声明  可以标识类型

function sum(x: string, y: string) {
  return x + y;
}

// ts 中具备类型推导  可以根据右边的值来推算变量的类型
type ISum = (m: string, n: string) => string;
const sum1: ISum = (x: string, y: string): string => x + y;

//函数中的默认值 和 可选参数
function defaultFn(a: string, b: string = "abc", c?: string) {
  console.log(a, b, c); // a,abc,undefined
}
defaultFn("1");

// 函数中的arguments
function spreadArg(...args: number[]) {
  args;
}
spreadArg(1, 2, 3, 4, 5);
export {};

// 函数中的this类型  this形参名必须为this 且必须为第一个参数
function callThis(this: { name: string }, value: string) {
  this.name;
}
callThis.call({ name: "nan" }, "abc");

// typof  取变量的类型， typeof后只是变量 不可以为数据

let obj = { name: "nan" };
function callThis1(this: MyThis, value: string) {
  this.name;
}
type MyThis = typeof obj;
// type MyThis = typeof { name: "nan" }   error
callThis1.call(obj, "abc");

// 函数的重载  解决问题：返回值由参数类型决定无法推导

function toArray(value: string | number): string[] | number[] {
  if (typeof value === "string") {
    return value.split(",");
  } else {
    return value.toString().split(",");
  }
}
let sArr = toArray("1,2,3"); // sArr类型为  string[]
let nArr = toArray(123); // nArr类型为   number[]

function toArray1(value: string): string[];
function toArray1(value: number): number[];
function toArray1(value: any) {
  // 方法重载必须哈方法放在一起
  if (typeof value === "string") {
    return value.split(",");
  } else {
    return value.toString().split(",");
  }
}
let sArr1 = toArray1("1,2,3"); // sArr类型为   string[]
let nArr1 = toArray1(123); //  nArr类型为   number[]
